home *** CD-ROM | disk | FTP | other *** search
- /* saveblocks.m */
-
- #include "idbsp.h"
-
- short datalist[0x10000],
- *data_p;
-
- /*
- short *datalist;
- short *data_p;
- */
- float orgx,
- orgy;
-
- #define BLOCKSIZE 128
-
-
- float xl,
- xh,
- yl,
- yh;
-
- boolean LineContact(worldline_t * wl)
- {
- NXPoint *p1,
- *p2,
- pt1,
- pt2;
- float lxl,
- lxh,
- lyl,
- lyh;
- divline_t ld;
- int s1,
- s2;
-
- p1 = &wl -> p1;
- p2 = &wl -> p2;
- ld.pt.x = p1 -> x;
- ld.pt.y = p1 -> y;
- ld.dx = p2 -> x - p1 -> x;
- ld.dy = p2 -> y - p1 -> y;
-
- if (p1 -> x < p2 -> x)
- {
- lxl = p1 -> x;
- lxh = p2 -> x;
- }
- else
- {
- lxl = p2 -> x;
- lxh = p1 -> x;
- }
- if (p1 -> y < p2 -> y)
- {
- lyl = p1 -> y;
- lyh = p2 -> y;
- }
- else
- {
- lyl = p2 -> y;
- lyh = p1 -> y;
- }
-
- if (lxl >= xh || lxh < xl || lyl >= yh || lyh < yl)
- return false; /* no bbox intersections */
-
- if (ld.dy / ld.dx > 0)
- { /* positive slope */
- pt1.x = xl;
- pt1.y = yh;
- pt2.x = xh;
- pt2.y = yl;
- }
- else
- { /* negetive slope */
- pt1.x = xh;
- pt1.y = yh;
- pt2.x = xl;
- pt2.y = yl;
- }
-
- s1 = PointOnSide(&pt1, &ld);
- s2 = PointOnSide(&pt2, &ld);
-
- return s1 != s2;
- }
-
-
- /*
- ================
- =
- = GenerateBlockList
- =
- ================
- */
-
- void GenerateBlockList(int x, int y)
- {
- NXRect r;
- worldline_t *wl;
- int count,
- i;
-
- *data_p++ = 0; /* leave space for thing links */
-
- xl = orgx + x * BLOCKSIZE;
- xh = xl + BLOCKSIZE;
- yl = orgy + y * BLOCKSIZE;
- yh = yl + BLOCKSIZE;
-
- r.origin.x = xl;
- r.origin.y = yl;
- r.size.width = r.size.height = BLOCKSIZE;
- /*
- if (draw)
- NXEraseRect (&r);
- */
- /*
- count = [linestore_i count];
- wl = [linestore_i elementAt: 0];
- */
- count = linestore_i -> count;
- wl = linestore_i -> data;
- for (i = 0; i < count; i++, wl++)
- {
- if (wl -> p1.x == wl -> p2.x)
- { /* vertical */
- if (wl -> p1.x < xl || wl -> p1.x >= xh)
- continue;
- if (wl -> p1.y < wl -> p2.y)
- {
- if (wl -> p1.y >= yh || wl -> p2.y < yl)
- continue;
- }
- else
- {
- if (wl -> p2.y >= yh || wl -> p1.y < yl)
- continue;
- }
- /* *data_p++ = SHORT(i); */
- *data_p++ = i;
- continue;
- }
- if (wl -> p1.y == wl -> p2.y)
- { /* horizontal */
- if (wl -> p1.y < yl || wl -> p1.y >= yh)
- continue;
- if (wl -> p1.x < wl -> p2.x)
- {
- if (wl -> p1.x >= xh || wl -> p2.x < xl)
- continue;
- }
- else
- {
- if (wl -> p2.x >= xh || wl -> p1.x < xl)
- continue;
- }
- /* *data_p++ = SHORT(i); */
- *data_p++ = i;
- continue;
- }
- /* diagonal */
- if (LineContact(wl))
- /* *data_p++ = SHORT(i); */
- *data_p++ = i;
- }
-
- *data_p++ = -1; /* end of list marker */
- }
-
-
- /*
- ================
- =
- = SaveBlocks
- =
- block lump holds:
- orgx
- orgy
- blockwidth
- blockheight
- listoffset[blockwidth*blockheight]
- lists
- one short left blank for thing list
- linedef numbers
- -1 terminator
-
- ================
- */
-
- void SaveBlocks(void)
- {
- int blockwidth,
- blockheight;
- int x,
- y,
- len;
- short *pointer_p;
-
- blockwidth = (worldbounds.size.width + BLOCKSIZE - 1) / BLOCKSIZE;
- blockheight = (worldbounds.size.height + BLOCKSIZE - 1) / BLOCKSIZE;
- orgx = worldbounds.origin.x;
- orgy = worldbounds.origin.y;
-
- pointer_p = datalist;
- /*
- *pointer_p++ = SHORT(orgx);
- *pointer_p++ = SHORT(orgy);
- *pointer_p++ = SHORT(blockwidth);
- *pointer_p++ = SHORT(blockheight);
- */
- *pointer_p++ = orgx;
- *pointer_p++ = orgy;
- *pointer_p++ = blockwidth;
- *pointer_p++ = blockheight;
-
- data_p = pointer_p + blockwidth * blockheight;
-
- for (y = 0; y < blockheight; y++)
- for (x = 0; x < blockwidth; x++)
- {
- len = data_p - datalist;
- /* *pointer_p++ = SHORT(len); */
- *pointer_p++ = len;
- GenerateBlockList(x, y);
- }
-
- len = 2 * (data_p - datalist);
-
- printf("blockmap: (%i, %i) = %i\n", blockwidth, blockheight, len);
-
- #if 0
- {
- int outhandle;
-
- outhandle = SafeOpenWrite("blockmap.lmp");
- SafeWrite(outhandle, datalist, len);
- close(outhandle);
- }
- #endif
-
- /* [wad_i addName: "blockmap" data:datalist size:len]; */
- addName("blockmap", datalist, len);
-
- }
-